home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs47.d81 / c64hdpro.arc / C2SEC.SRC next >
Text File  |  2009-10-10  |  8KB  |  342 lines

  1. ;BPUT"C2SEC.SRC
  2. ;RPUT"C2SEC.SRC
  3. ;
  4. ;+++++++++++++++++++++++++++++++++
  5. ;+ SECTOR, SAT, AND DISK ADDRESS +
  6. ;+ ROUTINES.                     +
  7. ;+ ENTRY POINTS:                 +
  8. ;+* SEC2CYLDCB - CONVERT SECNUM TO   +
  9. ;+    MSBSEC, LSB, HEAD FORMAT.  +
  10. ;+* SEC2CYLDCB1 - CONVERT CYLMSB AND  +
  11. ;+    SECTOR NUMBER TO MSBSEC    +
  12. ;+    FORMAT WITH OUTPUT IN      +
  13. ;+    CYLMSB.                    +
  14. ;+* SECTR2CYLINDR - CONVERT SECNUM TO   +
  15. ;+    CYLMSB, CYLLSB, HEAD,      +
  16. ;+    SECTOR.                    +
  17. ;+* SAT2SECTOR  - CONVERT SATSEC,     +
  18. ;+    SATBYT, AND SATBIT TO A    +
  19. ;+    SECTOR NUMBER.             +
  20. ;+* SECTOR2SAT - CONVERT SECNUM TO   +
  21. ;+    SAT ENTRY.  INPUT IS X -   +
  22. ;+    HI BYTE OF SECNUM, A - MID +
  23. ;+    BYTE OF SECNUM, AND Y - LOW+
  24. ;+    BYTE OF SECNUM.            +
  25. ;+* CYL2SECTORDCB - CONVERT DCB FORMAT  +
  26. ;+    DISK ADDRESS TO SECNUM.    +
  27. ;+    INPUT: A - DRIVE-HEAD      +
  28. ;+           X - MSB CYLINDER    +
  29. ;+           Y - LSB CYLINDER    +
  30. ;+* CYLINDER2SECTR - CONVERT HEAD, CYLLSB+
  31. ;+    CYLMSB, & SECTOR TO SECNUM.+
  32. ;+++++++++++++++++++++++++++++++++
  33. ;
  34. ;+++++++++++++++++++++++++++++++++
  35. ;+THE FOLLOWING AREAS ARE USED BY+
  36. ;+ THESE SUBROUTINES.            +
  37. ;+-------------------------------+
  38. ;+ SHIFTS 1 BYTE WORK            +
  39. ;+ WORKA  3 BYTE WORK AREA       +
  40. ;+ WORKB  2 BYTE WORK AREA       +
  41. ;+ WORKC  2 BYTE WORK AREA       +
  42. ;+ SECNUM 3 BYTE SECTOR NUMBER IN+
  43. ;+          HI, MED, LO FORMAT   +
  44. ;+ SATSEC 1 BYTE SAT SECTOR      +
  45. ;+ SATBYT 2 BYTE BYTE OFFSET IN  +
  46. ;+          SAT SECTOR. HI, LO   +
  47. ;+ SATBIT 1 BYTE BIT MASK OF SAT +
  48. ;+          SECTOR BYTE          +
  49. ;+ CYLMSB 1 BYTE MSB OF CYLINDER +
  50. ;+ CYLLSB 1 BYTE LSB OF CYLINDER +
  51. ;+ HEAD   1 BYTE HEAD NUMBER     +
  52. ;+ SECTOR 1 BYTE SECTOR NUMBER   +
  53. ;+ SECTRK 1 BYTE NUMBER OF       +
  54. ;+          SECTORS PER TRACK    +
  55. ;+ SECCYL 1 BYTE NUMBER OF       +
  56. ;+          SECTORS PER CYLINDER +
  57. ;+++++++++++++++++++++++++++++++++
  58. ;
  59. ;
  60. ;+++++++++++++++++++++++++++++++++
  61. ;+ CONVERT RELATIVE SECTOR NUMBER+
  62. ;+ TO CYLINDER, HEAD AND SECTOR. +
  63. ;+                               +
  64. ;+ INPUT - FIELD SECNUM WHICH    +
  65. ;+  CONTAINS THE RELATIVE SECTOR.+
  66. ;+                               +
  67. ;+ OUTPUT - FIELDS HEAD, CYLLSB, +
  68. ;+  CYLMSB, AND SECTOR FILLED AND+
  69. ;+  A - HEAD NUMBER              +
  70. ;+  Y - CYLINDER LSB             +
  71. ;+  X - SECTOR AND CYL MSB       +
  72. ;+++++++++++++++++++++++++++++++++
  73. ;
  74. ;
  75. SEC2CYLDCB JSR SECTR2CYLINDR ;GO CONVERT
  76. SEC2CYLDCB1 LDX #6 ;PUT CHR IN DCB FORM
  77.  LDA CYLMSB
  78. SHIFTMSBLEFT ASL A
  79.  DEX
  80.  BNE SHIFTMSBLEFT
  81.  ORA SECTOR
  82.  STA CYLMSB
  83.  RTS ;TIS DONE
  84. ;
  85. SECTR2CYLINDR LDA #0 ;ZERO WORK, ETC.
  86.  STA WORKB
  87.  STA WORKB+1
  88.  STA WORKC+1
  89.  STA HEAD
  90.  STA CYLMSB
  91.  STA CYLLSB
  92.  LDX #2 ;MOVE SECNUM TO WORK A
  93. MOVESECNUM2A LDA SECNUM,X
  94.  STA WORKA,X
  95.  DEX
  96.  BPL MOVESECNUM2A
  97.  JSR DEFSET ;GET PTR TO PARMTAB
  98.  LDA PTSCYL,X ;GET SECTOR PER CYL
  99.  STA WORKC ;TIMES HEX 100
  100.  INC WORKB ;MAKE COUNTER 256
  101.  LDX #9 ;PRIME COUNT DOWN
  102. CALCCYLINDER JSR DIVIDESECTOR ;GO SUBTRACT
  103.  BCC UPDATEOPERANDS
  104.  LDA WORKB+1
  105.  CLC
  106.  ADC CYLLSB
  107.  STA CYLLSB
  108.  LDA WORKB
  109.  ADC CYLMSB
  110.  STA CYLMSB
  111.  JMP CALCCYLINDER ;GO SEE IF MORE
  112. ;
  113. UPDATEOPERANDS LSR WORKB ;ADJUST ADDER
  114.  ROR WORKB+1
  115.  LSR WORKC ;SHIFT DIVISOR
  116.  ROR WORKC+1
  117.  DEX
  118.  BNE CALCCYLINDER ;TRY SOME MORE
  119.  LDA #17 ;GET NUM SEC PER TRK
  120.  STA WORKC+1 ;IN SUBTRACTOR
  121. CALCULATEHEAD JSR DIVIDESECTOR ;GO SUBTRACT
  122.  BCC SAVESECTORNUM ;GO IF DONE
  123.  INC HEAD
  124.  BNE CALCULATEHEAD
  125. SAVESECTORNUM LDA WORKA+2 ;GET SECTOR NUM
  126.  STA SECTOR
  127.  RTS
  128. ;
  129. ;
  130. ;+++++++++++++++++++++++++++++++++
  131. ;+ SUBTRACT WORKC FROM WORK A IF +
  132. ;+ WORKA >= WORKC                +
  133. ;+ RETURN CARRY SET   FOR DIDIT. +
  134. ;+ RETURN CARRY CLEAR FOR SMALL. +
  135. ;+++++++++++++++++++++++++++++++++
  136. ;
  137. DIVIDESECTOR LDA WORKA ;CHECK HI SEC BYT
  138.  BNE SUBTRACTEM
  139.  LDA WORKA+1 ;CHECK SECOND BYTE
  140.  CMP WORKC ;FOR <=
  141.  BCC DIVIDERETURN ;GO IF TOO SMALL
  142.  BNE SUBTRACTEM ;GO NOT EQUAL
  143.  LDA WORKA+2 ;CHECK LOW BYTE
  144.  CMP WORKC+1
  145.  BCC DIVIDERETURN ;TOO SMALL GO ON
  146. SUBTRACTEM LDA WORKA+2 ;SUBTRACT
  147.  SEC
  148.  SBC WORKC+1
  149.  STA WORKA+2
  150.  LDA WORKA+1
  151.  SBC WORKC
  152.  STA WORKA+1
  153.  LDA WORKA
  154.  SBC #0
  155.  STA WORKA
  156.  SEC
  157. DIVIDERETURN RTS
  158. ;
  159. ;+++++++++++++++++++++++++++++++++
  160. ;+ CONVERT SATSEC, SATBYT, AND   +
  161. ;+ SATBIT TO RELATIVE SECTOR #.  +
  162. ;+                               +
  163. ;+ INPUT - FIELDS SATSEC, SATBYT +
  164. ;+    AND SATBIT.                +
  165. ;+                               +
  166. ;+ OUTPUT- RELATIVE SECTOR IN    +
  167. ;+ SECNUM.                       +
  168. ;+++++++++++++++++++++++++++++++++
  169. ;
  170. SAT2SECTOR LDA #0 ;INIT SECTOR NUM
  171.  STA SECNUM
  172.  LDX #4 ;NUMBER TO SHIFT
  173.  LDA SATSEC ;GET FIELD
  174. SHIFTSATSECLF ASL A
  175.  ROL SECNUM
  176.  DEX
  177.  BNE SHIFTSATSECLF
  178.  STA SECNUM+1
  179.  LDA SATBYT ;GET HI
  180.  STA WORKA
  181.  LDX #3 ;MULTIPLY BY 8
  182.  LDA SATBYT+1 ;NOW LO BYTE OFFSET
  183. SHIFTSATBYTLF ASL A
  184.  ROL WORKA
  185.  DEX
  186.  BNE SHIFTSATBYTLF
  187.  STA SECNUM+2
  188.  CLC
  189.  LDA WORKA ;ADD HI BYTE
  190.  ADC SECNUM+1
  191.  STA SECNUM+1
  192.  LDA SATBIT ;GET THE BIT NUMBER
  193.  LDX #0
  194. SHIFTSATBITLF ASL A ;SHIFT TILL IT GOES
  195.  BCS ADDTOSECNUM ;OUT
  196.  INX
  197.  BNE SHIFTSATBITLF
  198. ADDTOSECNUM TXA ;SET UP FOR ADD
  199.  JMP ADDBYTE2SECNUM
  200. ;CLC
  201. ;ADC SECNUM+2 ;ADD TO TOTAL
  202. ;STA SECNUM+2
  203. ;BCC SAT2SECRETURN
  204. ;INC SECNUM+1 ;ELSE ADD OVERFLOW
  205. ;BNE SAT2SECRETURN
  206. ;INC SECNUM
  207. ;SAT2SECRETURN RTS ;RETURN
  208. ;
  209. ;+++++++++++++++++++++++++++++++++
  210. ;+ CONVERT SECTOR NUMBER TO SAT  +
  211. ;+ ENTRY.                        +
  212. ;+                               +
  213. ;+ INPUT: A-MIDDLE BYTE OF SECNUM+
  214. ;+        X-HI BYTE OF SECNUM    +
  215. ;+        Y-LO BYTE OF SECNUM    +
  216. ;+                               +
  217. ;+                               +
  218. ;+ OUTPUT: SAT SECTOR, BYTE, AND +
  219. ;+         BIT IN BYTE.          +
  220. ;+ SATSEC - SECTOR NUMBER OF SATE+
  221. ;+ SATBYT - BYTE OF SATE         +
  222. ;+ SATBIT - BIT OF BYTE          +
  223. ;+++++++++++++++++++++++++++++++++
  224. ;
  225. SECTOR2SAT STA SATSEC ;A HAS MIDDLE BYTE
  226.  AND #$0F ;ISOLATE LOW 12 BITS FOR  
  227.  STA SATBYT ;FOR SATBYT
  228.  TXA ;GET HI BYTE OF SECNUM
  229.  LDX #4 ;NEED TO SHIFT FOR SATSEC
  230. DIVIDEBY4096 LSR A ;SATSEC = INT(SECNUM/4096)
  231.  ROR SATSEC
  232.  DEX
  233.  BNE DIVIDEBY4096 ;DO ALL 4 SHIFTS
  234.  TYA ;GET LOW BYTE OF SECNUM
  235.  STA SATBYT+1 ;PUT IN OFFSET
  236.  AND #$07 ;ISOLATE THE BIT NUMBER
  237.  TAX ;NOW PUT BIT IN ITS PLACE
  238.  LDA #$80 ;PRIME BIT
  239. SHIFTSEC DEX ;CHECK IF THRU
  240.  BMI SAVESATBIT
  241.  LSR A
  242.  BNE SHIFTSEC
  243. SAVESATBIT STA SATBIT ;NOW HAVE BIT
  244.  LDX #3 ;NOW DIVIDE BYTE OFFSET BY 8
  245. DIVIDSATBYTBY8 LSR SATBYT
  246.  ROR SATBYT+1
  247.  DEX
  248.  BNE DIVIDSATBYTBY8
  249.  RTS
  250. ;
  251. ;+++++++++++++++++++++++++++++++++
  252. ;+ CONVERT CYLINDER, HEAD, SECTOR+
  253. ;+ TO SECTOR NUMBER.             +
  254. ;+                               +
  255. ;+ THERE ARE 2 ENTRIES TO THIS   +
  256. ;+ SUBROUTINE.                   +
  257. ;+ CYL2SECTORDCB - INPUT IS AS FOLLOWS  +
  258. ;+     A - DRIVE-HEAD BYTE       +
  259. ;+     X - MSB-SECTOR            +
  260. ;+     Y - LSB CYLINDER          +
  261. ;+                               +
  262. ;+ CYLINDER2SECTR - THE FOLLOWING FIELDS +
  263. ;+     MUST BE INITIALIZED BEFORE+
  264. ;+     CALLING THIS ENTRY.       +
  265. ;+  HEAD, SECTOR, CYLLSB, CYLMSB +
  266. ;+                               +
  267. ;+++++++++++++++++++++++++++++++++
  268. ;
  269. CYL2SECTORDCB STY CYLLSB ;PUT IN LSB OF CYLINDER
  270.  AND #$0F ;ISOLATE JUST THE HEAD
  271.  STA HEAD
  272.  TXA ;GET MSB AND SECTOR
  273.  AND #$1F ;ISOLATE SECTOR NUMBER
  274.  STA SECTOR
  275.  TXA ;NOW HANDLE MSB OF CYLINDER
  276.  LDX #6 ;NUMBER OF SHIFTS
  277. SHIFTDOWNMSB LSR A
  278.  DEX
  279.  BNE SHIFTDOWNMSB
  280.  STA CYLMSB ;PUT IT AWAY
  281. ;
  282. CYLINDER2SECTR LDA #0 ;CLEAR THE RESULT FIELD
  283.  STA SECNUM
  284.  STA SECNUM+1
  285.  STA SECNUM+2
  286.  LDY #8 ;PRIME SHIFTS
  287.  JSR DEFSET ;GET PARM TAB OFFSET
  288.  LDA PTSCYL,X ;AND SECTOR PER CYL
  289.  STA WORKB
  290. MULIPLYCYLINDR = * ;CLEAR CARRY
  291.  LDA CYLLSB ;GET LOW CYL NUMBER
  292.  STA WORKA+2
  293.  LDA CYLMSB ;GET HIGH CYL NUMBER
  294.  STA WORKA+1
  295.  LDA #0 ;CLEAR NEXT WORK
  296.  STA WORKA
  297.  DEY
  298.  ASL WORKB ;SHIFT SEC/CYL
  299.  BCC ANYMORESHIFTS
  300.  TYA ;MOVE TO X
  301.  TAX
  302.  BEQ ADDTOSECNUM2
  303.  CLC
  304. SHIFTWORKAL ASL WORKA+2
  305.  ROL WORKA+1
  306.  ROL WORKA
  307.  DEX
  308.  BNE SHIFTWORKAL
  309. ADDTOSECNUM2 LDX #2
  310.  CLC
  311. ADDTOSECNUMLP LDA SECNUM,X
  312.  ADC WORKA,X
  313.  STA SECNUM,X
  314.  DEX
  315.  BPL ADDTOSECNUMLP
  316. ANYMORESHIFTS CPY #0 ;ANY MORE?
  317.  BNE MULIPLYCYLINDR
  318. ;+ ADD IN HEAD X SECTOR PER TRK
  319.  LDX HEAD ;GET COUNTER
  320.  BEQ ADDSECT2SECNUM ;GO IF HEAD 0
  321. ADDHEADXSECTRK LDA #17 ;GET SECTORS PER TRACK
  322.  JSR ADDBYTE2SECNUM ;GO ADD TO TOTAL
  323.  DEX
  324.  BNE ADDHEADXSECTRK
  325. ;+ ADD THE SECTOR
  326. ADDSECT2SECNUM LDA SECTOR
  327.  JSR ADDBYTE2SECNUM
  328.  LDA SECNUM
  329.  LDX SECNUM+1
  330.  LDY SECNUM+2
  331.  RTS
  332. ADDBYTE2SECNUM CLC
  333.  ADC SECNUM+2
  334.  STA SECNUM+2
  335.  BCC ADDALLDONE
  336.  INC SECNUM+1
  337.  BNE ADDALLDONE
  338.  INC SECNUM
  339. ADDALLDONE = *
  340.  RTS
  341. ;
  342. .END C2SEC